package com.mamingchao.basic.swardToOffer.two;

import com.sun.deploy.util.ArrayUtil;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.yaml.snakeyaml.util.ArrayUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 给定一个数组arr,求差值为k的去重数字对。
 * 思路：将数组中的数，放到Hash 结构里面，key是 arr中的值，value默认是0；0表示该数尚未用过;
 * 当然，如果arr里的值能确定在一个优先范围内，这个Hash结构也可以简化为以 arr中的值为index，value为0的确定范围数组
 * 从左到右，单向的遍历每个数；比如 第一个数为3，则判断 3-k和 3+k 是否在数组或者hash结构中，切他们的value是否是0；
 * 如果是0，则组合出来，然后再更新成1； 如果是1，则放弃
 */
public class FixDeviationInArr {

    public static void main(String[] args) {
        final int[] arr = {3,2,1,5,0,7};
        final int k = 2;
        Integer[][] result = getDevationResult(arr, k);


        for (int i = 0; i < result.length; i++) {
            if (Objects.nonNull(result[i][1])){
                System.out.println(result[i][0]+ " : " + result[i][1]);
            }

            if (Objects.nonNull(result[i][2])){
                System.out.println(result[i][0]+ " : " + result[i][2]);
            }
        }

    }

    // 结合上面的内容，整体考量，用Hash结构吧，题干没有说arr是不是在一个有限范围内
    private static Integer[][]  getDevationResult(int[] arr, int k) {
        if (Objects.isNull(arr) || arr.length == 0 ) {
            return new Integer[0][0];
        }

        Integer[][] result = new Integer[arr.length][3];

        Map<Integer, Integer> temp = Arrays.stream(arr)
                .boxed() // 将IntStream转换为Stream<Integer>
                .collect(Collectors.toMap(
                        num -> num,      // key mapper
                        num -> 0         // value mapper
                ));

        for (int i = 0; i < arr.length; i++) {
            int manusKey = arr[i] - k;
            int plusKey = arr[i] + k;

            // 如果 减掉k的值，也在数组里面
            if (temp.containsKey(manusKey)){
                result[i][0] = arr[i];
                result[i][1] = manusKey;
                temp.remove(manusKey);
                temp.remove(arr[i]);
            }

            // 如果 增加k的值，也在数组里面
            if (temp.containsKey(plusKey)){
                result[i][0] = arr[i];
                result[i][2] = plusKey;
                temp.remove(plusKey);
                temp.remove(arr[i]);
            }
        }
        return result;
    }
}
